package es.mfp.practicos.domain;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;

import es.mfp.practicos.util.DateUtils;

@Entity
@Table(name = "CONSUMO_PUNTOS")
public class ConsumoPuntos extends Registro implements Serializable,
		Comparable<ConsumoPuntos> {

	private static final long serialVersionUID = -5150918310346952856L;

	private Integer puntosConsumidos = null;

	@NotNull(message = "Debe indicar la fecha del comsumo")
	private Date fechaConsumo = new Date();

	@NotEmpty(message = "Debe indicar el concepto del consumo")
	@Size(max = 250)
	private String concepto = null;

	public LineaFactura getLineaFactura() {
		return lineaFactura;
	}

	public void setLineaFactura(LineaFactura lineaFactura) {
		this.lineaFactura = lineaFactura;
	}

	@ManyToOne
	private LineaFactura lineaFactura = null;

	public Integer getPuntosConsumidos() {
		if (lineaFactura != null) {
			return lineaFactura.getPuntosAcumulados();
		}

		return puntosConsumidos;
	}

	public void setPuntosConsumidos(Integer puntosConsumidos) {
		this.puntosConsumidos = puntosConsumidos;
	}

	public Date getFechaConsumo() {
		return fechaConsumo;
	}

	public void setFechaConsumo(Date fechaConsumo) {
		this.fechaConsumo = fechaConsumo;
	}

	public String getConcepto() {
		return concepto;
	}

	public void setConcepto(String concepto) {
		this.concepto = concepto;
	}

	@Override
	public int compareTo(ConsumoPuntos o) {
		if (getId() != null && o.getId() != null) {
			return getId().compareTo(o.getId());
		}

		return getFechaConsumo().compareTo(o.getFechaConsumo());
	}

	@Override
	public int hashCode() {
		if (getId() == null) {
			return super.hashCode();
		} else {
			return getId().hashCode();
		}
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == null || !(obj instanceof ConsumoPuntos)) {
			return false;
		}
		return getId().equals(((ConsumoPuntos) obj).getId());
	}

	public static ConsumoPuntos build(LineaFactura lf) {

		ConsumoPuntos res = new ConsumoPuntos();
		res.setConcepto("Puntos acumulados por consumos desde "
				+ DateUtils.formatDate(lf.getFactura().getFechaDesde())
				+ " hasta "
				+ DateUtils.formatDate(lf.getFactura().getFechaHasta()) + ".");
		res.setFechaConsumo(new Date());
		res.setLineaFactura(lf);

		return res;
	}
}
